package city.spring.modules.expense.repository;

import city.spring.modules.expense.entity.ExpenseRecordEntity;
import city.spring.modules.expense.vo.ExpenseRecordEntityVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;

/**
 * 存储库：费用记录（缴费/消费）
 *
 * @author pxm
 * @date 2020-08-25 15:19:20
 */
@Repository
public interface ExpenseRecordRepository extends BaseMapper<ExpenseRecordEntity> {
    /**
     * 分页获取预存缴费记录
     *
     * @param page    分页对象
     * @param wrapper 查询对象
     * @return 预存缴费记录
     */
    IPage<ExpenseRecordEntityVO> depositListPage(Page<? extends ExpenseRecordEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends ExpenseRecordEntity> wrapper);

    /**
     * 获取 个别老人的月度缴费记录 List
     *
     * @param personId
     * @return
     */
    List<ExpenseRecordEntityVO> getOnesMonthPayRecords(String personId);

    /**
     * 通过billId获取费用记录
     *
     * @param billId
     * @return
     */
    ExpenseRecordEntity getByBillId(String billId);

    /**
     * 退住结算记录
     *
     * @param page
     * @param wrapper
     * @return
     */
    IPage<ExpenseRecordEntityVO> getSettlementRecords(Page<? extends ExpenseRecordEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends ExpenseRecordEntity> wrapper);

    /**
     * 根据老人ID获取最新的结算记录，用于结算审核
     *
     * @param oldmanId
     * @return
     */
    ExpenseRecordEntityVO getLatestSettlementRecord(String oldmanId);

    /**
     * 根据费用ID获取最新的结算记录，用于结算审核
     *
     * @param id
     * @return
     */
    ExpenseRecordEntityVO getSettlementRecord(String id);

    /**
     * 结算账单：应交账单 根据结算记录Id，对应的老人id，获取入住记录中老人最新的的入住日期、退住日期，再从缴费明细记录获取这两个日期间的明细记录。
     *
     * @param expecseId
     * @return
     */
    List<ExpenseRecordEntityVO> getBillDetailsBetween2Date(String expecseId);

    /**
     * 结算打印：获取长者信息和结算信息
     *
     * @param expenseId
     * @return
     */
    ExpenseRecordEntityVO getSettlementPrintInfo(String expenseId);

    /**
     * 单据打印：老人最新的入住记录的入住日期、退住日期，再从缴费明细记录获取这两个日期间的明细记录。
     *
     * @param expenseId
     * @return
     */
    List<ExpenseRecordEntityVO> getBillPrintDetail(String expenseId);

    /**
     * 同届结算ID，获取退住老人的押金
     *
     * @param expenseId
     * @return
     */
    Object getDepositByExpenseId(String expenseId);

    /**
     * 通过费用id，获取预存余额
     *
     * @param expenseId
     * @return
     */
    BigDecimal getDepositBalanceByExpenseId(String expenseId);

}